struct CustomSmartPointer {
    data: String
}

// 实现drop trait
// drop会在对象离开作用域时自动调用
impl Drop for CustomSmartPointer {
    // drop不可以手动调用, 因为它是个destructor, 即析构函数
    fn drop(&mut self) {
        println!("Dropping CustomSmartPointer with data `{}`!", self.data);
    }
}
// drop是预导入的, 所以无需引入
// use std::mem::drop;
fn main() {
    let c1 = CustomSmartPointer {data: String::from("hello")};
    // 析构函数不能手动调用, 所以这里不会调用drop
    // c1.drop(); // drop是一个destructor, 所以不能手动调用
    // 因为drop trait中的drop无法手动调用
    // 所以我们可以调用std::::mem::drop来手动调用drop, 因为是prelud, 所以无需引入就能用了
    drop(c1);
    let c2 = CustomSmartPointer {data: String::from("world")};
    println!("CustomSmartPointer created.");
}
